import pandas as pd
import numpy as np

# 异常值处理
"""
-- describe()函数：计算数据集的统计信息，包括count、mean、std、min、25%、50%、75%、max等。
-- df.info()函数：查看数据集的基本信息，包括行数、列数、数据类型、内存占用等。
-- df.std()函数：计算数据集的标准差。
-- df.drop()函数：删除数据集中缺失值。
-- unique()函数：查看数据集中唯一值。去重
-- query()函数：按照条件筛选数据集。
-- df.sort_values()函数：按照值排序
-- df.sort_index()函数：按照索引排序
"""

print("异常值检测和过滤")
print('\n1.describe()函数：查看每一列的描述性统计量')
data = np.random.randint(1, 10, size=(4, 4))
index = ['A', 'B', 'C', 'D']
columns = ['python', 'java', 'c++', 'javascript']
df = pd.DataFrame(data, index=index, columns=columns)
print(df)
print(df.describe())

print('\n2.df.std()函数：计算数据集的标准差')
print(df.std())

print('\n3.df.drop()函数：删除数据集中缺失值')
df1 = df.copy()
print(df1.drop("A"))  # 删除A行
print(df1.drop('javascript', axis=1))  # 删除javascript列

print(df1.drop(index='A'))  # 删除A行
print(df1.drop(columns='javascript'))  # 删除javascript列
# 删除多列或者多行
print(df1.drop(columns=['python', 'java']))  # 删除python和java列
print(df1.drop(index=['B', 'C']))  # 删除B和C行
print(df1.drop(index=['B', 'C'], inplace=True))  # 删除B和C行，并修改原数据集
print(df1)

print('\n4.unique()函数：查看数据集中唯一值')
df2 = df.copy()
print(df2)
print(df2['python'].unique())  # 查看数据集中唯一值

print('\n5.query()函数：按照条件筛选数据集')
# ==  ， >  ， <  ， >=  ， <=  ， !=  ， in  ， not in   , and  ， or ,&  ， |  ， ~
df3 = df.copy()
print(df3)
print(df3.query('python == 5'))  # 找到python列中等于9的所有行
print(df3.query('python > 5'))
print(df3.query('python > 5 and java == 5'))

print(df3.query('python > 5 & java > 5'))
print(df3.query('python > 5 | java > 5'))
print(df3.query('python > 5 or java > 5'))
print(df3.query('python in [1, 2, 3]'))  # 成员运算符

# 使用成员变量
n = 6
print(df3.query('python > @n'))  # @n表示使用变量n的值
m = [1, 2, 3, 4, 5]
print(df3.query('python in @m'))

print('\n6.df.sort_values()函数：按照值排序'
      'df.sort_index()函数：按照索引排序')
df4 = df.copy()
print(df4)
# sort_value : 默认按照列名排序，默认升序（常用）
print('\n按值排序')
print(df4.sort_values(by='python'))
# according:是否升序排列，默认True升序，False降序
print(df4.sort_values(by='python', ascending=False))  # 降序
# 根据行索引名排序，会把列进行排序（不常用）
print(df4.sort_values('A', axis=1))

# sort_index : 默认按照行索引排序，默认升序（常用）
# 默认是对行索引进行排序，默认是升序
print('\n按索引排序')
print(df4.sort_index(ascending=False))
print(df4.sort_index(ascending=True, axis=1))  # 对列索引进行排序

print('\n7.df.info()函数：查看数据集的基本信息')
# info:查看数据集的基本信息，包括行数、列数、数据类型、内存占用等。
print(df4.info())

print('\n练习')
"""
新建一个形状为10000*3的标准正态分布的dataframe(np.random.randn)
去除掉所有满足以下情况的行：期中任一元素绝对值大于三倍的标准差
"""
df = pd.DataFrame(np.random.randn(10000, 3))
print(df)
print('-------------------')
cond = df.abs() > 3 * df.std()
print(cond)
print('**************')
cond2 = cond.any(axis=1)
print(cond2)
print(cond2.sum())
print('----------')
df = df.loc[~cond2]
print(df)
